home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / windows / graphs / multicon.arj / MULTICON.CPP < prev    next >
C/C++ Source or Header  |  1994-03-09  |  10KB  |  328 lines

  1. //*************************************************************
  2. //  File name: MULTICON.CPP
  3. //
  4. //  Description:
  5. //     Implementation for the CMulticonApp class.
  6. //
  7. //  History:    Date       Author     Comment
  8. //              3/8/94     FJB        Created
  9. //
  10. // Written by Microsoft Product Support Services, Windows Developer Support
  11. // Copyright (c) 1994 Microsoft Corporation. All rights reserved.
  12. //*************************************************************
  13.  
  14. #include "stdafx.h"
  15. #include "multicon.h"
  16. #include "micondoc.h"
  17. #include "mainfrm.h" 
  18. #include "modview.h"
  19. #include "ellpsevw.h"
  20. #include "rectview.h" 
  21. #include "iconwnd.h" 
  22.  
  23. //*************************************************************
  24. //  Class:
  25. //      CMulticonApp 
  26. //
  27. //  Description:
  28. //      AppWizard generated CWinApp derived class.
  29. //
  30. //  Derived from:
  31. //      CWinApp
  32. //
  33. //  Data Members: 
  34. //
  35. //  Member Functions:
  36. //      CMulticonApp      : Constructor
  37. //     ~CMulticonApp      : Destructor
  38. //  
  39. //    Implementation:
  40. //      InitInstance      : AppWizard generated.
  41. //      OnIdle            : Enumerates all open views and calls 
  42. //                          InvalidateRect on each.  If the view's frame
  43. //                          is iconic, calls InvalidateRect on the frame.
  44. //
  45. //    Message Handlers:
  46. //      OnAppAbout        : Displays the 'Help About' dialog.
  47. //
  48. //      
  49. //
  50. //  History:    Date       Author     Comment
  51. //              3/8/94     FJB        Created
  52. //
  53. //*************************************************************  
  54.  
  55.  
  56. #ifdef _DEBUG
  57. #undef THIS_FILE
  58. static char BASED_CODE THIS_FILE[] = __FILE__;
  59. #endif
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CMulticonApp
  63.  
  64. BEGIN_MESSAGE_MAP(CMulticonApp, CWinApp)
  65.    //{{AFX_MSG_MAP(CMulticonApp)
  66.    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  67.       // NOTE - the ClassWizard will add and remove mapping macros here.
  68.       //    DO NOT EDIT what you see in these blocks of generated code!
  69.    //}}AFX_MSG_MAP
  70.    // Standard file based document commands
  71.    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  72.    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  73. END_MESSAGE_MAP()
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CMulticonApp construction
  77.  
  78. CMulticonApp::CMulticonApp()
  79. {
  80.    // TODO: add construction code here,
  81.    // Place all significant initialization in InitInstance
  82. }  
  83.  
  84. //*************************************************************
  85. //
  86. //  Class
  87. //      CMulticonApp
  88. //
  89. //  Member Function:
  90. //      OnIdle
  91. //
  92. //  Purpose:
  93. //      Drives the updating of all open views and icons.
  94. //
  95. //  Parameters: 
  96. //      LONG lCount - The number of times this function has been
  97. //                    consecutively called.
  98. //  Return: 
  99. //      BOOL:
  100. //         TRUE  - more OnIdle time needed (at least one view open.)
  101. //         FALSE - OnIdle processing complete (no open views)
  102. //
  103. //  Comments:   
  104. //      This function has the following specific behaviors:
  105. //
  106. //      1. Causes each open view to redraw.
  107. //      2. If a view is minimized, causes it's frame to redraw
  108. //      3. If the application is minimized, causes the main frame
  109. //         to redraw using the active view's output
  110. //
  111. //
  112. //  History:    Date       Author     Comment
  113. //              3/8/94     FJB        Created
  114. //
  115. //*************************************************************
  116.  
  117.  
  118. BOOL CMulticonApp::OnIdle(LONG lCount)
  119. {  
  120.    // Do the base class thing and remember the return value.  Use this 
  121.    // return value if no views are open.
  122.    BOOL fMore = CWinApp::OnIdle(lCount);
  123.    
  124.    // Store the size of an icon
  125.    CRect rc(0,0,GetSystemMetrics(SM_CXICON)-1,
  126.                 GetSystemMetrics(SM_CYICON)-1);
  127.                 
  128.    CWnd* pWnd = AfxGetMainWnd();
  129.    
  130.    
  131.    if (pWnd->IsIconic())
  132.    {  
  133.       // The application is minimized, we need to draw an icon.   
  134.       // See if there is a MDI child.
  135.       if (((CMDIFrameWnd*) pWnd)->MDIGetActive())
  136.       { 
  137.          // At least one view is open.  Update it.     
  138.          pWnd->InvalidateRect(&rc,TRUE);
  139.          pWnd->UpdateWindow();
  140.          return TRUE;
  141.       }
  142.       
  143.       // There were no open views, so the main frame is displaying a 
  144.       // standard icon.  Since this won't change there's no point in
  145.       // forcing a refresh.
  146.    }
  147.    
  148.    // Now we walk the list of all open views.  For an explanation of the
  149.    // algorithm, see article Q106455 in the Microsoft Knowledge Base:
  150.    // - (GO MSKB)
  151.  
  152.    // First, walk the list of document templates
  153.    POSITION pos = m_templateList.GetHeadPosition();
  154.    while (pos)
  155.    {
  156.       CDocTemplate* pTemplate =
  157.                      (CDocTemplate*)m_templateList.GetNext(pos);
  158.       
  159.       POSITION pos2 = pTemplate->GetFirstDocPosition();
  160.   
  161.       // Next, walk the list of documents for each template
  162.       while (pos2)
  163.       {
  164.          CDocument * pDocument;
  165.          if ((pDocument=pTemplate->GetNextDoc(pos2)) != NULL)
  166.          {  
  167.             // At this point we know there is at least one open view,
  168.             // so make sure we continue to get OnIdle calls
  169.             fMore = TRUE;                                 
  170.             
  171.             POSITION pos3 = pDocument->GetFirstViewPosition();
  172.             
  173.             // Finally, walk the list of each views for each doc.
  174.             while (pos3)
  175.             {
  176.                CView* pView;
  177.                if ((pView=pDocument->GetNextView(pos3)) != NULL)
  178.                {  
  179.                   // If the views parent (the CMDIChildWnd) is iconic, then
  180.                   // we need to refresh an icon sized region on the parent
  181.                   if (pView->GetParent()->IsIconic())
  182.                   { 
  183.                      // We have to specify a CRect because the available
  184.                      // area is actually somewhat larger than an icon.
  185.                      // Specify bErase = FALSE so we don't erase everything
  186.                      // already drawn (the view's don't remember their 
  187.                      // contents.)
  188.                      pView->GetParent()->InvalidateRect(&rc,FALSE);
  189.                      
  190.                      // We have to call UpdateWindow here to prevent a 
  191.                      // WM_PAINT from going through the apps message queue.
  192.                      // Normally, this would be fine but we want OnIdle
  193.                      // to be called during OnEnterIdle, when a menu or
  194.                      // dialog is displayed.  Try commenting this call
  195.                      // out to see what happens...                    
  196.                      pView->GetParent()->UpdateWindow();
  197.                   }
  198.                   else
  199.                   {  
  200.                      // It's business as usual, cause the view to repaint
  201.                      pView->InvalidateRect(NULL, FALSE);                 
  202.                      
  203.                      // See above comment for the purpose of this call.
  204.                      pView->UpdateWindow();
  205.                   }
  206.                }
  207.             } // while (pos3)       
  208.             
  209.          } // if ((pDocument=pTemplate->GetNextDoc(pos))...
  210.       } // while (pos2)
  211.    } // while (pos) 
  212.  
  213.    return fMore;    
  214. }
  215.  
  216.  
  217. /////////////////////////////////////////////////////////////////////////////
  218. // The one and only CMulticonApp object
  219.  
  220. CMulticonApp NEAR theApp;
  221.  
  222. /////////////////////////////////////////////////////////////////////////////
  223. // CMulticonApp initialization
  224.  
  225. BOOL CMulticonApp::InitInstance()
  226. {
  227.    // Standard initialization
  228.    // If you are not using these features and wish to reduce the size
  229.    //  of your final executable, you should remove from the following
  230.    //  the specific initialization routines you do not need.
  231.  
  232.    SetDialogBkColor();        // Set dialog background color to gray
  233.    LoadStdProfileSettings();  // Load standard INI file options 
  234.                               //      (including MRU)
  235.  
  236.    // Register the application's document templates.  Document templates
  237.    //  serve as the connection between documents, frame windows and views.
  238.  
  239.    CMultiDocTemplate* pDocTemplate;
  240.  
  241.    pDocTemplate = new CMultiDocTemplate(
  242.       IDR_RECTTYPE,
  243.       RUNTIME_CLASS(CMulticonDoc),
  244.       RUNTIME_CLASS(CIconWnd),        // standard MDI child frame
  245.       RUNTIME_CLASS(CRectView));
  246.    AddDocTemplate(pDocTemplate);  
  247.  
  248.    pDocTemplate = new CMultiDocTemplate(
  249.       IDR_ELLIPSETYPE,
  250.       RUNTIME_CLASS(CMulticonDoc),
  251.       RUNTIME_CLASS(CIconWnd),        // standard MDI child frame
  252.       RUNTIME_CLASS(CEllipseView));
  253.    AddDocTemplate(pDocTemplate);
  254.  
  255.  
  256.  
  257.    // create main MDI Frame window
  258.    CMainFrame* pMainFrame = new CMainFrame;
  259.    if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
  260.       return FALSE;
  261.    m_pMainWnd = pMainFrame;
  262.  
  263.    if (m_lpCmdLine[0] != '\0')
  264.    {
  265.       // TODO: add command line processing here
  266.    }
  267.  
  268.    // The main window has been initialized, so show and update it.
  269.    pMainFrame->ShowWindow(m_nCmdShow);
  270.    pMainFrame->UpdateWindow();
  271.    
  272.       // create a new document
  273.    OnFileNew();
  274.    
  275.    return TRUE;
  276. }
  277.  
  278. /////////////////////////////////////////////////////////////////////////////
  279. // CAboutDlg dialog used for App About
  280.  
  281. class CAboutDlg : public CDialog
  282. {
  283. public:
  284.    CAboutDlg();
  285.  
  286. // Dialog Data
  287.    //{{AFX_DATA(CAboutDlg)
  288.    enum { IDD = IDD_ABOUTBOX };
  289.    //}}AFX_DATA
  290.  
  291. // Implementation
  292. protected:
  293.    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  294.    //{{AFX_MSG(CAboutDlg)
  295.       // No message handlers
  296.    //}}AFX_MSG
  297.    DECLARE_MESSAGE_MAP()
  298. };
  299.  
  300. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  301. {
  302.    //{{AFX_DATA_INIT(CAboutDlg)
  303.    //}}AFX_DATA_INIT
  304. }
  305.  
  306. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  307. {
  308.    CDialog::DoDataExchange(pDX);
  309.    //{{AFX_DATA_MAP(CAboutDlg)
  310.    //}}AFX_DATA_MAP
  311. }
  312.  
  313. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  314.    //{{AFX_MSG_MAP(CAboutDlg)
  315.       // No message handlers
  316.    //}}AFX_MSG_MAP
  317. END_MESSAGE_MAP()
  318.  
  319. // App command to run the dialog
  320. void CMulticonApp::OnAppAbout()
  321. {
  322.    CAboutDlg aboutDlg;
  323.    aboutDlg.DoModal();
  324. }
  325.  
  326. /////////////////////////////////////////////////////////////////////////////
  327. // CMulticonApp commands
  328.